#include "mandelbrot.h"
#include "../py/video.h"
#include <time.h>

using namespace std;

void mainTest(bool dirigido);

void mainMandelbrot(int size, int iter) {
    cout << "Para hacer zoom seleccione donde quiere hacer zoom" << endl;
    cout << "para terminar presione escape" << endl;
	Video video = *(new Video(1<<size,1<<size));
    if(!video.isOn()){
        cout << "Video no inicializo" << endl;
        cout << "llamar a este ejecutable desde la carpeta donde se encuentre \"genVideo.py\""  << endl;
        abort();
    }
    int zoom = 0;
	int* matriz = video.matriz();
    time_t start,end;
    time(&start);
    Mandelbrot mandela(matriz, size, iter);
    time(&end);
    cout << difftime(end, start) << " segs tomo generar esta imagen." << endl;
    cout << zoom << "° nivel" << endl;
    video.refresh();
	int pos[2] = {0,0};	
	while( true ){
		video.waitForClick(pos);
		if( pos[0] == -1 || pos[1] == -1)		
			break; 
        time(&start);
		mandela.genera(pos[0],pos[1]);
        time(&end);
        zoom++;
        cout << "Tomo : " << difftime(end, start) << " segundos generar esta imagen" << endl;
        cout << zoom << "° nivel" << endl;
		video.refresh();
	}
}

void usage(char* nombre) {
    string name = string(nombre);
    int pos = name.find_last_of('/');
    name = name.substr(pos+1);
    cout << "Como usar este ejecutable" << endl;
    cout << name << " -h : muestra esta ayuda" << endl;
    cout << name << " debug [-d] : corre los tests, y con -d es un test dirigido"<< endl;
    cout << name << " mandelbrot <dim> <precision> <iter> : comienza mandelbrot con tamaño de pantalla 2^dim, la precision dada y iter de iteraciones inicial" << endl;
}

int main(int argc, char *argv[]) {
    if(argc > 1 && string(argv[1]) == "debug") {
        if(argc > 2){
            mainTest(true);
        } else {
            mainTest(false);
        }
    } else if(argc > 1 && string(argv[1]) == "mandelbrot"){
        if(argc != 5){
            usage(argv[0]);
        } else {
            int dim = atoi(argv[2]);
            int lim = atoi(argv[3]);
            int ite = atoi(argv[4]);
            cout << "Tamaño de pantalla = " << (1<<dim) << endl;
            cout << "Precision del float = " << lim << endl;
            Float::setLimit(lim);
            mainMandelbrot(dim, ite);
        }
    } else {
        usage(argv[0]);
    }
    cout << "MUCHAS GRACIAS POR PARTICIPAR" << endl;
    return 0;
}